#!/usr/bin/python
# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui
from PythonUI.Ui_Page3 import Ui_Page3
import os
import sys
import re
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QWidget
from DAC.SalleDAC import Salle
from DAC.BatimentDAC import Batiment

class Page3(Ui_Page3,QtGui.QDialog):
    """
    Page de selection des salles
    """
    def __init__(self,session):
        """
        Fonction d'initialisation
        """
        self.app = QtGui.QApplication(sys.argv)
        QtGui.QDialog.__init__(self)
        self.session=session
        os.system("touch ~/.GWA/dicosalle")
        self.parametre={}
        self.filename = ""
        self.dico={}

    def affich(self,param):
        """
        Fonction d'affichage de la fenetre
        """
        self.setupUi(self)
        self.show()
        sys.exit(self.app.exec_())

    def suivant(self):
        """
        Fonction appelee lors de la validation du bouton 'Ok'
        """
        if (self.lineEdit_nom.displayText() == ''):
            QtGui.QMessageBox.critical(self, "GWA", "Le nom de la salle ne doit pas etre vide !", QtGui.QMessageBox.Ok)
            #On quitte la fonction
            return ''
        if (self.filename == ''):
            QtGui.QMessageBox.critical(self, "GWA", "Pas de plan de salle!", QtGui.QMessageBox.Ok)
            #On quitte la fonction
            return ''
        if (self.doubleSpinBox_longueur.value() == 0.0 or self.doubleSpinBox_largeur.value() == 0.0):
            QtGui.QMessageBox.critical(self, "GWA", "Dimensions incorrectes", QtGui.QMessageBox.Ok)
            #On quitte la fonction
            return ''
        self.recup_dico()
        self.parametre["id"]
        self.dico["nom"]=self.lineEdit_nom.displayText()
        self.dico["description"]=self.lineEdit_description.displayText()
        self.dico["realheight"]=self.doubleSpinBox_longueur.value()
        self.dico["realwidth"]=self.doubleSpinBox_largeur.value()
        self.dico["x"]=int(self.doubleSpinBox_X.value())
        self.dico["y"]=int(self.doubleSpinBox_Y.value())
        self.dico["z"]=int(self.doubleSpinBox_Z.value())
        self.dico["url_plan"]=self.filename

        salle=Salle()
        index=self.comboBox_inser_salle.currentIndex()
        if (index >= 1):
            salle=Salle(self.list[index-1]["ID"])
            salle.createByDico(self.dico)
            salle.updateIntoDb(self.parametre["id"])
        else:   
            salle.createByDico(self.dico)
            salle.insertToDb(self.parametre["id"])
        fichier=open(os.path.expanduser('~') + '/.GWA/dicosalle','a')
        fichier.write('\nnom:'+self.lineEdit_nom.displayText())
        fichier.write('\ndescription:'+self.lineEdit_description.displayText())
        fichier.write('\nrealheight: %f'  % self.doubleSpinBox_longueur.value())
        fichier.write('\nrealwidth: %f' % self.doubleSpinBox_largeur.value())
        fichier.write('\nurl_plan:'+self.filename)
        fichier.write('\npreviousheight:'+str(self.objImg.height()))
        fichier.write('\npreviouswidth:'+str(self.objImg.width()))
        fichier.write('\nnextheight:'+str(self.objImgModif.height()))
        fichier.write('\nnextwidth:'+str(self.objImgModif.width()))
        fichier.write('\nx:'+str(self.dico["x"]))
        fichier.write('\ny:'+str(self.dico["y"]))
        fichier.write('\nz:'+str(self.dico["z"]))
        fichier.write('\nid:'+str(salle.id["value"]))
        fichier.close()
        self.close()
        os.system("./Main.py 4")
             
    def precedent(self):
        """
        Fonction appele lors de la validation du bouton 'Annuler'
        """
        self.close()
        os.system("./Main.py 2")

    def recup_dico(self):
        """
        Remplissage du dictionnaire depuis un fichier sur le disque
        """
        fichier=open(os.path.expanduser('~') + '/.GWA/dicobatiment','r')
        expr=re.compile("[A-Za-z]")
        for line in fichier.readlines():
            if expr.findall(line):
                self.parametre[line.split(":")[0].split("\n")[0]]=line.split(":")[1].split("\n")[0]
        fichier.close()

    def displayPicture(self):
        """
        Mise a jour du label plan avec l'image qui va bien
        """
        #On vide le label:
        self.label_plan.clear()
        # redimensionnement de l'image
        self.objImgModif = self.objImg.scaled(451,406,Qt.KeepAspectRatio,Qt.FastTransformation)
        # taille de l'image
        a = self.objImgModif.height()
        b = self.objImgModif.width()
        # affichage de l'objet image dans le label
        self.label_plan.clear()
        self.label_plan.setPixmap(QtGui.QPixmap.fromImage(self.objImgModif))

    def displaySalle(self):
        """
        Remplissage des champs de la fenetre avec les infos de la BDD
        """
        index=self.comboBox_inser_salle.currentIndex()
 
        if index >= 1:
            self.pushButton_supprimer.setEnabled(True)
            self.lineEdit_nom.setText(self.list[index-1]["nom"])
            self.doubleSpinBox_longueur.setValue(self.list[index-1]["realheight"])
            self.doubleSpinBox_largeur.setValue(self.list[index-1]["realwidth"])
            self.filename= self.list[index-1]["url_plan"]
            #SC - 09/09/2010 - On ne recupere pas la description car c'est pas implementé dans la BDD !!!!
            #self.lineEdit_description.setText(self.list[index-2]["description"])
            # Affichage de l'objet image
            self.objImg=QtGui.QImage(self.filename)
            self.displayPicture()
            self.doubleSpinBox_X.setValue(self.list[index-1]["x"])
            self.doubleSpinBox_Y.setValue(self.list[index-1]["y"])
            self.doubleSpinBox_Z.setValue(self.list[index-1]["z"])
        #On Clear tous les champs
        else:
            self.pushButton_supprimer.setEnabled(False)
            self.lineEdit_nom.clear()
            self.lineEdit_description.clear()
            self.doubleSpinBox_longueur.clear()
            self.doubleSpinBox_largeur.clear()
            self.lineEdit_description.clear()
            self.doubleSpinBox_X.setValue(0.0)
            self.doubleSpinBox_Y.setValue(0.0)
            self.doubleSpinBox_Z.setValue(0.0)
            self.label_plan.clear()

      
    def parcourir(self):
        """
        Recuperation d'une image qui sera le plan de la salle
        """ 
        # On récupère le chemin de l'image à récupérer
        self.filename = str(QtGui.QFileDialog.getOpenFileName(self, 'Open file',  os.path.expanduser('~'),"Images (*.png *.jpg)"))
 
        # test pour vérifier que le chemin à bien été récupéré    
        b="echo "+self.filename    
        os.system(b)
       
        # Affichage de l'objet image
        self.objImg=QtGui.QImage(self.filename)
        self.displayPicture()

    def supprimer(self):
        """
        Suppression de la salle
        """
        index=self.comboBox_inser_salle.currentIndex()
        salle_to_delete= Salle(self.list[index-1]['ID'])
        nb_enregistrements=salle_to_delete.deleteFromDb()
        print nb_enregistrements
        self.maj_comboBox()
        self.comboBox_inser_salle.setCurrentIndex(index-1)

    def confirmation(self):
        """
        Confirmation de suppression de la salle
        Fonction appele en premier par le bouton de suppression de la salle
        """
        reply = QtGui.QMessageBox.question(self, 'GWA',"Etes vous sur de vouloir supprimer cette salle ?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            self.supprimer()
        else:
            pass

    def maj_comboBox(self):
        """
        Mise a jour de la comboBox 
        """
        self.comboBox_inser_salle.clear()
        self.comboBox_inser_salle.addItem("nouvelle salle")
        batiment=Batiment(self.parametre["id"])
        self.list=batiment.selectSallesFromDB()
        for salle in self.list:
             self.comboBox_inser_salle.addItem(salle["nom"])

    def setupUi(self, Dialog):
        """
        Definition de l'interface graphique.
        La majorite de cette fonction est decrite dans le fichier genere par pyuic4 dans PythonUI/...
        """
        Ui_Page3.setupUi(self,Dialog)
        self.comboBox_inser_salle.addItem("nouvelle salle")
        self.recup_dico()
        batiment=Batiment(self.parametre["id"])
        self.list=batiment.selectSallesFromDB()
        for salle in self.list:
             self.comboBox_inser_salle.addItem(salle["nom"])
        self.pushButton_supprimer.setEnabled(False)
        self.doubleSpinBox_X.setMaximum(999999.99)
        self.doubleSpinBox_Y.setMaximum(999999.99)
        self.doubleSpinBox_Z.setMaximum(999999.99)
        self.doubleSpinBox_longueur.setMaximum(999999.99)
        self.doubleSpinBox_largeur.setMaximum(999999.99)
        #Affichage du repere
        self.repere = QtGui.QImage("../images/pointeur1.png")
        self.repereModif = self.repere.scaled(60,60,Qt.KeepAspectRatio,Qt.FastTransformation)
        self.label_axe.clear()
	self.label_axe.setPixmap(QtGui.QPixmap.fromImage(self.repereModif))
        #Signaux
        self.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.suivant)
        self.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.precedent)
        self.connect(self.pushButton_supprimer, QtCore.SIGNAL("clicked()"), self.confirmation)
        self.connect(self.pushButton_inser_salle, QtCore.SIGNAL("clicked()"), self.parcourir)
        self.connect(self.comboBox_inser_salle, QtCore.SIGNAL("currentIndexChanged(int)"), self.displaySalle) 
        QtCore.QMetaObject.connectSlotsByName(Dialog)